//package cn.itsource.base.service.impl;
//
//import cn.itsource.base.anno.PreAuthorize;
//import cn.itsource.base.service.IPermissionScanService;
//import cn.itsource.base.util.Classutil;
//import cn.itsource.system.domain.Permission;
//import cn.itsource.system.mapper.PermissionMapper;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//import org.springframework.web.bind.annotation.*;
//
//import java.io.File;
//import java.io.FileFilter;
//import java.lang.annotation.Annotation;
//import java.lang.reflect.Method;
//import java.util.HashSet;
//import java.util.Set;
//import java.util.regex.Matcher;
//import java.util.regex.Pattern;
//
///**
// * @Description: 权限初始化类
// * @Author: Mr.She
// * @Version: 1.0
// * @Date: 2022/6/23 22:37
// */
//@Service
//public class PermissionScanServiceImpl implements IPermissionScanService {
//
//
//    // 扫描路径包前缀
//    private static final String PKG_PREFIX = "cn.itsource.";
//    // 扫描路径包后缀
//    private static final String PKG_SUFFIX = ".controller";
//
//    @Autowired
//    private PermissionMapper permissionMapper;
//
//    /**
//     * @Title: scanPermission
//     * @Description: 权限初始化业务方法
//     * @Author: Mr.She
//     * @Version: 1.0
//     * @Date: 2022/6/23 22:37
//     * @Parameters:
//     * @Return void
//     */
//    @Override
//    public void scanPermission() {
//        // 1.获取cn.itsource下面所有的模块目录
//        String path = this.getClass().getResource("/").getPath() + "/cn/itsource/";
//        File file = new File(path);
//        File[] files = file.listFiles(new FileFilter() {
//            @Override
//            public boolean accept(File file) {
//                return file.isDirectory();
//            }
//        });
//
//        // 2.获取cn.itsource.*.controller里面所有的类
//        Set<Class> clazzes = new HashSet<>();
//        for (File fileTmp : files) {
//            System.out.println(fileTmp.getName());
//            clazzes.addAll(Classutil.getClasses(PKG_PREFIX + fileTmp.getName() + PKG_SUFFIX));
//        }
//
//        // 3.遍历获取的每个类
//        for (Class clazz : clazzes) {
//            // 3.1.得到类中的所有方法，如果类中没有方法那么结束本次循环
//            Method[] methods = clazz.getMethods();
//            if (methods == null || methods.length < 1)
//                return;
//            // 3.2.遍历类中的所有方法
//            for (Method method : methods) {
//                // 1.得到该方法的请求地址
//                String uri = getUri(clazz, method);
//                try {
//                    // 2.获取到类上我们的自定义注解，判断如果没有此结束本次循环
//                    PreAuthorize preAuthorizeAnno = method.getAnnotation(PreAuthorize.class);
//                    if (preAuthorizeAnno == null)
//                        continue;
//                    // 3.得到我们自定义注解中的name和sn
//                    String name = preAuthorizeAnno.name();
//                    String permissionSn = preAuthorizeAnno.sn();
//                    // 4.根据sn编码查询权限对象
//                    Permission permissionTmp = permissionMapper.findBySn(permissionSn);
//                    // 5.如果不存在就添加权限
//                    if (permissionTmp == null) {
//                        Permission permission = new Permission();
//                        permission.setName(name);
//                        permission.setSn(permissionSn);
//                        permission.setUrl(uri);
//                        permissionMapper.add(permission);
//                    } else { // 6.如果存在就修改权限
//                        permissionTmp.setName(name);
//                        permissionTmp.setSn(permissionSn);
//                        permissionTmp.setUrl(uri);
//                        permissionMapper.update(permissionTmp);
//                    }
//                } catch (Exception e) {
//                    e.printStackTrace();
//                }
//            }
//        }
//    }
//
//
//    /**
//     * @Description: 根据类的字节码和类的方法得到方法的请求地址
//     * @Author: July
//     * @Date: 2022/7/10 23:37
//     * @param clazz: 类字节码对象
//     * @param method: 方法对象
//     * @return: java.lang.String
//     **/
//    private String getUri(Class clazz, Method method) {
//        String classPath = "";
//        Annotation annotation = clazz.getAnnotation(RequestMapping.class);
//        if (annotation != null) {
//            RequestMapping requestMapping = (RequestMapping) annotation;
//            String[] values = requestMapping.value();
//            if (values != null && values.length > 0) {
//                classPath = values[0];
//                if (!"".equals(classPath) && !classPath.startsWith("/"))
//                    classPath = "/" + classPath;
//            }
//        }
//        GetMapping getMapping = method.getAnnotation(GetMapping.class);
//        String methodPath = "";
//        if (getMapping != null) {
//            String[] values = getMapping.value();
//            if (values != null && values.length > 0) {
//                methodPath = values[0];
//                if (!"".equals(methodPath) && !methodPath.startsWith("/"))
//                    methodPath = "/" + methodPath;
//            }
//        }
//        PostMapping postMapping = method.getAnnotation(PostMapping.class);
//        if (postMapping != null) {
//            String[] values = postMapping.value();
//            if (values != null && values.length > 0) {
//                methodPath = values[0];
//                if (!"".equals(methodPath) && !methodPath.startsWith("/"))
//                    methodPath = "/" + methodPath;
//            }
//        }
//        DeleteMapping deleteMapping = method.getAnnotation(DeleteMapping.class);
//        if (deleteMapping != null) {
//            String[] values = deleteMapping.value();
//            if (values != null && values.length > 0) {
//                methodPath = values[0];
//                if (!"".equals(methodPath) && !methodPath.startsWith("/"))
//                    methodPath = "/" + methodPath;
//            }
//        }
//        PutMapping putMapping = method.getAnnotation(PutMapping.class);
//        if (putMapping != null) {
//            String[] values = putMapping.value();
//            if (values != null && values.length > 0) {
//                methodPath = values[0];
//                if (!"".equals(methodPath) && !methodPath.startsWith("/"))
//                    methodPath = "/" + methodPath;
//            }
//
//        }
//        PatchMapping patchMapping = method.getAnnotation(PatchMapping.class);
//        if (patchMapping != null) {
//            String[] values = patchMapping.value();
//            if (values != null && values.length > 0) {
//                methodPath = values[0];
//                if (!"".equals(methodPath) && !methodPath.startsWith("/"))
//                    methodPath = "/" + methodPath;
//            }
//        }
//        RequestMapping requestMapping = method.getAnnotation(RequestMapping.class);
//        if (requestMapping != null) {
//            String[] values = requestMapping.value();
//            if (values != null && values.length > 0) {
//                methodPath = values[0];
//                if (!"".equals(methodPath) && !methodPath.startsWith("/"))
//                    methodPath = "/" + methodPath;
//            }
//        }
//        return classPath + methodPath;
//    }
//
//    private String getPermissionSn(String value) {
//        String regex = "\\[(.*?)]";
//        Pattern p = Pattern.compile("(?<=\\()[^\\)]+");
//        Matcher m = p.matcher(value);
//        String permissionSn = null;
//        if (m.find()) {
//            permissionSn = m.group(0).substring(1, m.group().length() - 1);
//        }
//        return permissionSn;
//    }
//
//}